#pragma once  

#include<iostream>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include"../comm/util.hpp"
#include"../comm/log.hpp"

namespace ns_compile 
{
    using namespace ns_util;//引入路径拼接功能
    using namespace ns_log;//引入日志功能
    class Compiler//编译
    {
    public:
        Compiler()
        {}
        ~Compiler()
        {}    
        //子进程进行编译
        static bool Compile(const std::string& file)//加const
        {
            pid_t rid=fork();
            if(0==rid)
            {
                //ns_util::Info_file.IsExit(file);//?调用
                //将编译错误的信息重定向到file.stderr
                umask(0);//这样设置出来比较准确；
                int stderr=open(Path_file::Std_com_err(file).c_str(), O_CREAT | O_WRONLY, 0644);//..3
                //打开文件错误，应该在这里创建：Path_file::Stderr(file).c_str()；
                if(-1==stderr)
                {
                    //perror("open() fail!");
                    //LOG(WARNING) << "创建stderr文件失败"<<"\n";
                    LOG(WARNING)<<"创建stderr失败"<<std::endl;
                    exit(1);
                }
                dup2(stderr,2);
                //g++ -o des src -std=c++11                             
                execlp("g++","g++","-o",Path_file::Exe(file).c_str(),  Path_file::Src(file).c_str() ,"-D","COMPILER_ONLINE","-std=c++11", nullptr);//?？
                LOG(ERROR)<<"程序替换失败"<<std::endl;
                exit(3);//程序替换失败
                return false;
            }
            else if(-1==rid)
            {
                perror("fork() fail!");
                LOG(ERROR)<<"内部错误，创建子进程失败"<<std::endl;
                //exit(2);
                return false;
            }
            else
            {
                //父进程
                int w=waitpid(rid,nullptr,0);//返回值处理，，，
                if(Oper_file::IsFileExit(Path_file::Exe(file)))
                {
                    LOG(INFO)<<"编译成功，可执行程序为"<<Path_file::Src(file)<<std::endl;//没有c_str（）
                    return true;;
                }
            }
            LOG(ERROR)<<"编译失败，没有形成可执行程序"<<std::endl;
            return false;;
        }
    };

}